﻿using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AjaxControlToolkit;
using System.IO;
using System.Web.Services;

namespace FrontEndPlus.Módulos.Administración
{
    public partial class wbfrm_Facturacion_Matricula : System.Web.UI.Page
    {
        #region VARIABLES GLOBALES
        WCF_Gimnasio.cls_Facturar _factura = new WCF_Gimnasio.cls_Facturar();
        WCF_Gimnasio.cls_Cliente _cliente = new WCF_Gimnasio.cls_Cliente();
        WCF_Gimnasio.cls_Producto _producto = new WCF_Gimnasio.cls_Producto();
        WCF_Gimnasio.ServiceClient _servicio = new WCF_Gimnasio.ServiceClient();
        private WCF_Gimnasio.cls_Contro_Alertas _alerta;
        private String mensaje_error = String.Empty;
        private string lineaModificar = string.Empty;
        private string PrecioVenta, Utilidad;
        #endregion


        #region Método Cargar Datos
        private void Carga_Datos()
        {
            try
            {
                object resultado = new object();
                _factura.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                _servicio.OtrosProcesos(1, ref resultado, _factura);
                txt_factura.Text = resultado.ToString();
                gv_Factura.DataSource = Session["dt"];
                gv_Factura.DataBind();
                if (Session["descripcion"] != null)
                    txt_Descripcion.Text = Session["descripcion"].ToString();
                if (Session["fecha"] != null)
                    txt_Fecha.Text = Session["fecha"].ToString();
                else
                    txt_Fecha.Text = DateTime.Now.Date.ToShortDateString();
                if (Session["subtotal"] != null)
                    txt_SubTotal.Text = Session["subtotal"].ToString();
                if (Session["descuento"] != null)
                    txt_DescuentoTotal.Text = Session["descuento"].ToString();
                if (Session["impuesto"] != null)
                    txt_IV.Text = Session["impuesto"].ToString();
                if (Session["total"] != null)
                    txt_Total.Text = Session["total"].ToString();
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        #region Método Transferir datos a variables session
        private void Transferir_Datos()
        {
            try
            {
                Session["descripcion"] = txt_Descripcion.Text;
                Session["fecha"] = txt_Fecha.Text;
                Session["subtotal"] = txt_SubTotal.Text;
                Session["descuento"] = txt_DescuentoTotal.Text;
                Session["impuesto"] = txt_IV.Text;
                Session["total"] = txt_Total.Text;
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        #region Método Limpiar Campos
        private void limpiarFormulario()
        {
            try
            {
                lineaModificar = string.Empty;
                _producto = new WCF_Gimnasio.cls_Producto();
                gv_Factura.Enabled = false;
                txt_CodCliente.Text = string.Empty;
                txt_Descripcion.Text = string.Empty;
                txt_Identificacion.Text = string.Empty;
                txt_Nombre.Text = string.Empty;
                txt_Apellido.Text = string.Empty;
                txt_impuesto.Text = string.Empty;
                txt_Desc.Text = string.Empty;
                txt_SubTotal.Text = string.Empty;
                txt_Cant.Text = string.Empty;
                txt_id_articulo.Text = string.Empty;
                txt_cod_articulo.Text = string.Empty;
                txt_NombreArt.Text = string.Empty;
                txt_precio.Text = string.Empty;
                txt_IV.Text = string.Empty;
                txt_Desc.Text = string.Empty;
                txt_DescuentoTotal.Text = string.Empty;
                txt_Total.Text = string.Empty;
                btn_Nueva.Enabled = false;
                btn_borrar.Enabled = false;
                RequiredFieldValidator2.Enabled = false;
                Panel9.Enabled = false;
                for (int i = gv_Factura.Rows.Count - 1; i >= 0; i--)
                    gv_Factura.DeleteRow(i);
                gv_Factura.DataBind();
                Session["dt"] = null;
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        #region Método Deshabilitar y Habilitar Campos
        private void deshabilitarHabilitarCampos(int opcion)
        {
            try
            {
                if (opcion == 2)
                {
                    txt_Cant.Enabled = false;
                    txt_Desc.Enabled = false;
                    RequiredFieldValidator6.Enabled = false;
                    RequiredFieldValidator7.Enabled = false;
                    CompareValidator2.Enabled = false;
                    RangeValidator3.Enabled = false;

                }
                else if (opcion == 1)
                {
                    txt_Cant.Enabled = true;
                    txt_Desc.Enabled = true;
                    RequiredFieldValidator2.Enabled = true;
                    RequiredFieldValidator6.Enabled = true;
                    RequiredFieldValidator7.Enabled = true;
                    CompareValidator2.Enabled = true;
                    RangeValidator3.Enabled = true;
                }
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        #region Método Obtener Datos del Producto
        private void Obtener_Datos_Producto()
        {
            try
            {
                if (lineaModificar == "")
                {
                    bool vd = false;
                    if (txt_id_articulo.Text != "")
                    {
                        _producto.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                        _producto.IdProducto = Convert.ToInt32(txt_id_articulo.Text);
                        _producto = (WCF_Gimnasio.cls_Producto)_servicio.TraerObjeto(_producto);
                        PrecioVenta = _producto.PrecioVenta.ToString();
                        txt_impuesto.Text = string.Format("{0:N}", Convert.ToDecimal(_producto.Impuesto));
                        txt_precio.Text = string.Format("{0:N}", Convert.ToDouble(PrecioVenta));
                        _producto.Impuesto = Convert.ToDecimal(txt_impuesto.Text);
                        vd = true;
                    }

                    if (vd == true && txt_NombreArt.Text != "")
                    {
                        btn_agregar.Enabled = true;
                        gv_Factura.Enabled = true;
                    }
                    else
                    {
                        txt_precio.Text = string.Empty;
                        btn_agregar.Enabled = false;
                    }
                }
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        #region Método Crear DataTable los datos del producto
        public DataTable Crear_DataTable()
        {
            DataTable dt = new DataTable();
            try
            {
                dt.Columns.Add("Id Articulo", typeof(string));
                dt.Columns.Add("Codigo", typeof(string));
                dt.Columns.Add("Descripcion", typeof(string));
                dt.Columns.Add("Cantidad", typeof(string));
                dt.Columns.Add("Descuento", typeof(string));
                dt.Columns.Add("Impuesto", typeof(string));
                dt.Columns.Add("Precio", typeof(string));
                dt.Columns.Add("Total", typeof(string));
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
            return dt;
        }
        #endregion

        #region Método Llenar con datos del producto el DataTable
        public DataRow Llenar_DataTable(DataRow Row1, ref decimal SubTotal, ref decimal ImpuestoVenta, ref decimal PrecioVenta, ref decimal Descuento)
        {
            try
            {
                Row1["Id Articulo"] = txt_id_articulo.Text;
                Row1["Codigo"] = txt_cod_articulo.Text;
                Row1["Descripcion"] = txt_NombreArt.Text;
                Row1["Cantidad"] = Math.Round(Convert.ToDecimal(txt_Cant.Text), 2);
                Row1["Descuento"] = string.Format("{0:N}", (Descuento));
                Row1["Impuesto"] = string.Format("{0:N}", (ImpuestoVenta));
                Row1["Precio"] = string.Format("{0:N}", PrecioVenta);
                Row1["Total"] = string.Format("{0:N}", Convert.ToDouble(SubTotal) + Convert.ToDouble(Row1["Impuesto"]) - Convert.ToDouble(Row1["Descuento"]));
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
            return Row1;
        }
        #endregion

        #region Método Agregar los datos del producto al GridView
        private void Agregar_Producto_Grid()
        {
            try
            {
                _producto.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                _producto.IdProducto = Convert.ToInt32(txt_id_articulo.Text);
                _producto = (WCF_Gimnasio.cls_Producto)_servicio.TraerObjeto(_producto);
                if (!string.IsNullOrEmpty(txt_precio.Text) && !string.IsNullOrEmpty(txt_cod_articulo.Text))
                {
                    if (Convert.ToDecimal(txt_precio.Text) > 0)
                    {
                        if (Convert.ToInt32(txt_Cant.Text) <= _producto.CantidadActual)
                        {
                            bool pasar = false;
                            for (int i = 0; i < gv_Factura.Rows.Count; i++)
                            {
                                if (Convert.ToString(gv_Factura.Rows[i].Cells[1].Text) == txt_id_articulo.Text)
                                    pasar = true;
                            }

                            if (pasar == false)
                            {
                                decimal Porcentaje_Impuesto_Venta = Convert.ToDecimal(txt_impuesto.Text);
                                decimal PrecioVenta = Convert.ToDecimal(txt_precio.Text) * Convert.ToDecimal(txt_Cant.Text);
                                decimal ImpuestoProducto = (PrecioVenta/100)*Porcentaje_Impuesto_Venta;
                                decimal Descuento = (PrecioVenta/100)*Convert.ToDecimal(txt_Desc.Text);
                                decimal SubTotal = PrecioVenta+ImpuestoProducto-Descuento;
                                

                                if (Session["dt"] == null)
                                {
                                    DataTable dt = Crear_DataTable();
                                    DataRow Row1;
                                    Row1 = dt.NewRow();
                                    Row1 = this.Llenar_DataTable(Row1, ref SubTotal, ref ImpuestoProducto, ref PrecioVenta, ref Descuento);
                                    dt.Rows.Add(Row1);

                                    gv_Factura.DataSource = dt;
                                    gv_Factura.DataBind();
                                    Session["dt"] = dt;
                                }
                                else
                                {
                                    DataTable dt = (Session["dt"]) as DataTable;
                                    DataRow Row1;
                                    Row1 = dt.NewRow();
                                    Row1 = this.Llenar_DataTable(Row1, ref SubTotal, ref ImpuestoProducto, ref PrecioVenta, ref Descuento);
                                    dt.Rows.Add(Row1);
                                    gv_Factura.DataSource = dt;
                                    gv_Factura.DataBind();
                                    Session["dt"] = dt;
                                }

                                totalizarFactura();
                                txt_id_articulo.Text = string.Empty;
                                txt_cod_articulo.Text = string.Empty;
                                txt_NombreArt.Text = string.Empty;
                                txt_precio.Text = string.Empty;
                                txt_impuesto.Text = string.Empty;
                                txt_Cant.Text = string.Empty;
                                txt_Desc.Text = string.Empty;
                                btn_agregar.Enabled = false;
                                btn_borrar.Enabled = true;
                                btn_guardar.Enabled = true;
                                txt_id_articulo.Focus();
                                this.deshabilitarHabilitarCampos(2);
                                imgbtn_buscar_producto.Focus();
                            }
                            else
                                lbl_mensaje.Text = "PRODUCTO YA SE INGRESO UNA VEZ";
                        }
                        else
                            lbl_mensaje.Text = "SOBREPASA EL SALDO DEL ARTICULO";
                    }
                    else
                        lbl_mensaje.Text = "PRECIO DEL ARTICULO NO PUEDE SER O";
                }
                else
                    lbl_mensaje.Text = "ERROR AL PROCESAR EL MONTO DEL PRODUCTO";
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        #region Método Actualizar los datos del producto en el GridView
        private void actualizarLineaGrid()
        {
            try
            {
                if (!string.IsNullOrEmpty(txt_precio.Text) && !string.IsNullOrEmpty(txt_cod_articulo.Text))
                {
                    if (Convert.ToDecimal(txt_precio.Text) > 0)
                    {
                        bool pasar = false;
                        for (int i = 0; i < gv_Factura.Rows.Count; i++)
                        {
                            if (Convert.ToString(gv_Factura.Rows[i].Cells[1]) == txt_id_articulo.Text && Convert.ToString(gv_Factura.Rows[gv_Factura.SelectedRow.RowIndex].Cells[1]) != txt_id_articulo.Text)
                                pasar = true;
                        }

                        if (pasar == false)
                        {
                            decimal Porcentaje_Impuesto_Venta = Convert.ToDecimal(txt_impuesto.Text) * Convert.ToDecimal(0.01);
                            decimal PrecioVenta = Convert.ToDecimal(txt_precio.Text);
                            decimal SubTotal = Convert.ToDecimal(txt_precio.Text) * Convert.ToDecimal(txt_Cant.Text);
                            decimal Descuento = (SubTotal * Convert.ToDecimal(txt_Desc.Text) * Convert.ToDecimal(0.01));
                            decimal ImpuestoProducto = (SubTotal - Descuento) * Porcentaje_Impuesto_Venta;
                            decimal Desc = Descuento;
                            int linea = -1;
                            for (int i = 0; i < gv_Factura.Rows.Count; i++)
                            {
                                if (gv_Factura.Rows[i].Cells[1].Text == txt_id_articulo.Text)
                                    linea = gv_Factura.Rows[i].RowIndex;
                            }
                            if (Session["dt"] != null)
                            {
                                DataTable dt = (Session["dt"]) as DataTable;
                                DataRow Row1;
                                Row1 = dt.NewRow();
                                Row1 = this.Llenar_DataTable(Row1, ref SubTotal, ref ImpuestoProducto, ref PrecioVenta, ref Descuento);
                                dt.Rows.RemoveAt(linea);
                                dt.Rows.InsertAt(Row1, linea);
                                gv_Factura.DataSource = dt;
                                gv_Factura.DataBind();
                                gv_Factura.SelectedIndex = -1;
                                Session["dt"] = dt;
                            }

                            totalizarFactura();
                            txt_id_articulo.Text = string.Empty;
                            txt_cod_articulo.Text = string.Empty;
                            txt_NombreArt.Text = string.Empty;
                            txt_precio.Text = string.Empty;
                            txt_impuesto.Text = string.Empty;
                            txt_Cant.Text = string.Empty;
                            txt_Desc.Text = string.Empty;
                            btn_agregar.Enabled = false;
                            btn_guardar.Enabled = true;
                            btn_actualizar.Enabled = false;
                            btn_borrar.Enabled = false;
                            this.deshabilitarHabilitarCampos(2);
                            RequiredFieldValidator6.Enabled = true;
                            RequiredFieldValidator7.Enabled = true;
                            imgbtn_buscar_producto.Focus();
                        }
                        else
                            lbl_mensaje.Text = "CODIGO YA SE INGRESO UNA VEZ";
                    }
                    else
                        lbl_mensaje.Text = "PRECIO DEL ARTICULO NO PUEDE SER O";
                }
                else
                    lbl_mensaje.Text = "ERROR AL PROCESAR EL MONTO DEL PRODUCTO";
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        #region Método Finalizar Factura
        private void finalizarFactura()
        {
            try
            {
                if (!string.IsNullOrEmpty(txt_Total.Text))
                {
                    if (!string.IsNullOrEmpty(txt_factura.Text))
                    {
                        if (gv_Factura.Rows.Count > 0)
                        {
                            if (Convert.ToDecimal(txt_Total.Text) > 0)
                            {
                                _factura.IdUsuario = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                                _factura.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());
                                _factura.IdCliente = Convert.ToInt32(txt_CodCliente.Text);
                                _factura.IdGim = 1;
                                _factura.Descripcion = txt_Descripcion.Text;
                                _factura.Fecha = Convert.ToDateTime(txt_Fecha.Text);
                                _factura.SubTotal = Convert.ToDecimal(txt_SubTotal.Text);
                                _factura.Descuento = Convert.ToDecimal(txt_DescuentoTotal.Text);
                                _factura.Impuesto = Convert.ToDecimal(txt_IV.Text);
                                _factura.Total = Convert.ToDecimal(txt_Total.Text);
                                _factura.Estado = 13;

                                WCF_Gimnasio.cls_Facturas_Detalles[] _ArrayDetalle = new WCF_Gimnasio.cls_Facturas_Detalles[gv_Factura.Rows.Count];
                                _ArrayDetalle = generaDetallesFactura(_ArrayDetalle);

                                _servicio.InsertarActualizarRegistro(true, ref mensaje_error, _factura);
                                _factura.ArrayDetalle = _ArrayDetalle;
                                _servicio.InsertarActualizarRegistro(true, ref mensaje_error, _factura);
                                object resultado = new object();
                                _servicio.OtrosProcesos(2, ref resultado, _factura);
                                limpiarFormulario();
                                this.Carga_Datos();
                                if (resultado.ToString() != String.Empty)
                                {
                                    _alerta = new WCF_Gimnasio.cls_Contro_Alertas();
                                    _alerta.IdUsuarioInicioSeccion = Convert.ToInt32(HttpContext.Current.Session["idUsuario"].ToString());

                                    ExcelLibrary.DataSetHelper.CreateWorkbook("C:\\temp\\alertas.xls", _servicio.Listar(2, _alerta));
                                    DataSet ds = _servicio.Listar(3, _alerta);
                                    _alerta.Lista = ds.Tables[0];
                                    _alerta.Filtros = new string[1];
                                    _alerta.Filtros[0] = "1";
                                    object result = new object();
                                    _servicio.OtrosProcesos(1, ref result, _alerta);
                                    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", resultado.ToString(), false);
                                    lbl_mensaje1.Text = "Factura realizada satisfactoriamente";
                                }
                                else
                                {
                                    string mensaje = "<script type='text/javascript'> smoke.alert('Factura realizada satisfactoriamente', function (e) {}, {ok: 'OK',classname: 'custom-class'}); </script>";
                                    ScriptManager.RegisterStartupScript(this, typeof(Page), "alerta", mensaje, false);
                                }
                            }
                            else
                                lbl_mensaje.Text = "MONTO NO PUEDE SER NEGATIVO";
                        }
                        else
                            lbl_mensaje.Text = "DEBE INGRESAR ARTICULOS ANTES DE GENERAR FACTURA";
                    }
                    else
                        lbl_mensaje.Text = "EL NUMERO DE LA FACTURA NO PUEDE ESTAR EN BLANCO";
                }
                else
                    lbl_mensaje.Text = "ERROR AL PROCESAR EL TOTAL DE LA FACTURA";

            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message + "\n" + mensaje_error; }
        }
        #endregion

        #region Método Detalle de Factura
        private WCF_Gimnasio.cls_Facturas_Detalles[] generaDetallesFactura(WCF_Gimnasio.cls_Facturas_Detalles[] _ArrayDetalle)
        {
            try
            {
                int contadoArray = 0;
                for (int i = 0; i < gv_Factura.Rows.Count; i++)
                {
                    object resultado = new object();
                    _producto.IdProducto = Convert.ToInt32(gv_Factura.Rows[i].Cells[1].Text);
                    _servicio.OtrosProcesos(1, ref resultado, _producto);
                    decimal existencia = Convert.ToDecimal(resultado);

                    _ArrayDetalle[contadoArray] = new WCF_Gimnasio.cls_Facturas_Detalles();
                    _ArrayDetalle[contadoArray].IdProducto = Convert.ToInt32(gv_Factura.Rows[i].Cells[1].Text);
                    _ArrayDetalle[contadoArray].CantidadAnterior = existencia;
                    _ArrayDetalle[contadoArray].Cantidad = Convert.ToDecimal(gv_Factura.Rows[i].Cells[4].Text);
                    _ArrayDetalle[contadoArray].CantidadNueva = existencia - Convert.ToDecimal(gv_Factura.Rows[i].Cells[4].Text);
                    _ArrayDetalle[contadoArray].PrecioVenta = Convert.ToDecimal(gv_Factura.Rows[i].Cells[7].Text);
                    _ArrayDetalle[contadoArray].Impuesto = Convert.ToDecimal(gv_Factura.Rows[i].Cells[6].Text);
                    _ArrayDetalle[contadoArray].DescuentoProducto = Convert.ToDecimal(gv_Factura.Rows[i].Cells[5].Text);
                    _ArrayDetalle[contadoArray].TotalProducto = Convert.ToDecimal(gv_Factura.Rows[i].Cells[8].Text);
                    contadoArray += 1;
                }
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
            return _ArrayDetalle;
        }
        #endregion

        #region Método Totalizar Factura
        private void totalizarFactura()
        {
            try
            {
                double tSubtotal = 0;
                double tImpuesto = 0;
                double tDescuento = 0;
                double tTotal = 0;
                for (int i = 0; i < gv_Factura.Rows.Count; i++)
                {
                    tSubtotal += Convert.ToDouble(gv_Factura.Rows[i].Cells[7].Text);
                    tImpuesto += Convert.ToDouble(gv_Factura.Rows[i].Cells[6].Text);
                    tDescuento += Convert.ToDouble(gv_Factura.Rows[i].Cells[5].Text);
                    tTotal += Convert.ToDouble(gv_Factura.Rows[i].Cells[8].Text);
                }
                txt_SubTotal.Text = string.Format("{0:N}", tSubtotal);
                txt_IV.Text = string.Format("{0:N}", tImpuesto);
                txt_DescuentoTotal.Text = string.Format("{0:N}", tDescuento);
                txt_Total.Text = string.Format("{0:N}", tTotal);
            }
            catch (Exception ex)
            {
                Response.Write("Error: Carga incorrecta de datos. Detalles:" + ex.Message);
            }
        }
        #endregion

        #region Método Eliminar Línea del GridView
        private void borrar_Linea_Grid()
        {
            try
            {
                lineaModificar = string.Empty;
                gv_Factura.Enabled = false;
                txt_id_articulo.Text = string.Empty;
                txt_NombreArt.Text = string.Empty;
                btn_actualizar.Enabled = false;
                btn_agregar.Enabled = false;
                totalizarFactura();
                for (int i = gv_Factura.Rows.Count - 1; i >= 0; i--)
                    gv_Factura.DeleteRow(i);
            }
            catch (Exception ex)
            {
                Response.Write("Error: Carga incorrecta de datos. Detalles:" + ex.Message);
            }
        }
        #endregion

        #region Agrega los Datos a cajas de texto y activa botones para actualizar
        private void activaBotonesAgregarMoficar(int fila)
        {
            try
            {
                if (fila > -1)
                {
                    try
                    {
                        lineaModificar = fila.ToString();
                        txt_id_articulo.Text = gv_Factura.Rows[fila].Cells[1].Text;
                        txt_cod_articulo.Text = gv_Factura.Rows[fila].Cells[2].Text;
                        txt_NombreArt.Text = gv_Factura.Rows[fila].Cells[3].Text;
                        txt_precio.Text = gv_Factura.Rows[fila].Cells[8].Text;
                        if (Convert.ToDecimal(gv_Factura.Rows[fila].Cells[7].Text) > 0)
                        {
                            txt_impuesto.Text = gv_Factura.Rows[fila].Cells[7].Text;
                        }
                        else
                        {
                            txt_impuesto.Text = "0";
                        }
                        txt_Cant.Text = (Math.Round(Convert.ToDecimal(gv_Factura.Rows[fila].Cells[4].Text), 2)).ToString();
                        btn_actualizar.Enabled = true;
                        btn_agregar.Enabled = false;
                        btn_borrar.Enabled = true;
                        txt_Cant.Focus();
                        this.deshabilitarHabilitarCampos(1);
                    }
                    catch (Exception ex)
                    {
                        Response.Write("Error: Carga incorrecta de datos. Detalles:" + ex.Message);
                    }
                }
            }
            catch (Exception ex) { Response.Write("Error: Carga incorrecta de datos. Detalles:" + ex.Message); }
        }
        #endregion

        private static byte[] ConvertHexToBytes(string hex)
        {
            byte[] bytes = new byte[hex.Length / 2];
            for (int i = 0; i < hex.Length; i += 2)
            {
                bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);
            }
            return bytes;
        }

        [WebMethod(EnableSession = true)]
        public static string GetCapturedImage()
        {
            string url = HttpContext.Current.Session["CapturedImage"].ToString();
            HttpContext.Current.Session["CapturedImage"] = null;
            return url;
        }

        #region EVENTOS

        #region Cargar Página Page Load
        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!this.IsPostBack)
                {
                    if (Request.InputStream.Length > 0)
                    {
                        using (StreamReader reader = new StreamReader(Request.InputStream))
                        {
                            string hexString = Server.UrlEncode(reader.ReadToEnd());
                            string imageName = txt_CodCliente.Text; //DateTime.Now.ToString("dd-MM-yy hh-mm-ss");
                            string imagePath = string.Format("~/Capturas/{0}.png", imageName);
                            File.WriteAllBytes(Server.MapPath(imagePath), ConvertHexToBytes(hexString));
                            Session["CapturedImage"] = ResolveUrl(imagePath);
                        }
                    }
                }
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }


            if (!IsPostBack)
            {
                try
                {
                    this.Carga_Datos();
                    if (Request.QueryString["idCliente"] != null)
                    {
                        txt_CodCliente.Text = Request.QueryString["idCliente"];
                        txt_Identificacion.Text = Request.QueryString["cedCliente"];
                        txt_Nombre.Text = Request.QueryString["nomCliente"];
                        txt_Apellido.Text = Request.QueryString["apeCliente"];
                        TabContainer1.Enabled = true;
                    }
                    if (Request.QueryString["idProd"] != null)
                    {
                        txt_CodCliente.Text = Request.QueryString["idCliente"];
                        txt_Identificacion.Text = Request.QueryString["cedCliente"];
                        txt_Nombre.Text = Request.QueryString["nomCliente"];
                        txt_Apellido.Text = Request.QueryString["apeCliente"];

                        txt_id_articulo.Text = Request.QueryString["idProd"];
                        txt_cod_articulo.Text = Request.QueryString["codProd"];
                        txt_NombreArt.Text = Request.QueryString["nomProd"];

                        this.deshabilitarHabilitarCampos(1);

                        this.Obtener_Datos_Producto();
                    }

                    if (txt_CodCliente.Text != String.Empty)
                    {
                        Panel9.Enabled = true;
                    }
                }
                catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
            }
        }
        #endregion

        #region Evento Clic del Botón buscar Producto
        protected void imgbtn_buscar_producto_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                this.Transferir_Datos();
                Response.Redirect("wbfrm_Busca_Producto.aspx?idCliente="
                    + txt_CodCliente.Text
                    + "&cedCliente="
                    + txt_Identificacion.Text
                    + "&nomCliente="
                    + txt_Nombre.Text
                    + "&apeCliente="
                    + txt_Apellido.Text);
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }

        #endregion

        #region Evento Clic del Botón buscar Cliente
        protected void imgbtn_Busqueda_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                this.Transferir_Datos();
                Response.Redirect("wbfrm_Busca_Cliente.aspx");
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        #region Evento Clic del Botón Nuevo
        protected void btn_Nueva_Click(object sender, EventArgs e)
        {
            this.limpiarFormulario();
        }
        #endregion

        #region Evento Clic del Botón Agregar
        protected void btn_agregar_Click(object sender, EventArgs e)
        {
            this.Agregar_Producto_Grid();
        }
        #endregion

        #region Evento Clic del Botón Actualizar
        protected void btn_actualizar_Click(object sender, EventArgs e)
        {
            this.actualizarLineaGrid();
        }
        #endregion

        #region Evento Row Deleting del GridView
        protected void gv_Factura_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            try
            {
                if (gv_Factura.Rows.Count <= 0)
                {
                    btn_guardar.Enabled = false;
                }
            }
            catch (Exception ex) { lbl_mensaje.Text = ex.Message; }
        }
        #endregion

        #region Evento Row Command del GridView
        protected void gv_Factura_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            this.activaBotonesAgregarMoficar(Convert.ToInt32(e.CommandArgument));
        }
        #endregion

        #region Evento Clic Guardar
        protected void btn_guardar_Click(object sender, EventArgs e)
        {
            this.finalizarFactura();
        }
        #endregion

        #region Evento Clic Borrar
        protected void btn_borrar_Click(object sender, EventArgs e)
        {
            this.borrar_Linea_Grid();
        }
        #endregion
    }
}
        #endregion
